package DuiXingShuZu_5;

public class StudentTest {
    public static void main(String[] args) {
        //定义一个长度为3的数组，数组存储1~3名学生对象作为初始数据，学生对象的学号，姓名不相同
        //学生的属性：学号、姓名、年龄
        //要求：
        //[1].再次添加一个学生对象，并再添加时进行学号的唯一性判断
        //[2].添加完毕后，遍历所有学生信息
        //[3].通过id删除学生信息
        //  如果存在则删除，反之提示删除失败
        //[4].删除完毕后，遍历所有学生信息
        //[5].查询数组id为“2”的学生，如果存在，则将他的年龄+1岁

        //1.创建一个数组用来存储学生对象
        Student[] arr = new Student[3];

        //2.创建学生对象并添加到数组当中
        Student stu1 = new Student(1, "zhangsan", 23);
        Student stu2 = new Student(2, "lisi", 24);
        Student stu3 = new Student(3,"wangwu",25);

        //3.把学生对象添加到数组当中
        arr[0] = stu1;
        arr[1] = stu2;
        arr[2] = stu3;


        //[1].再次添加一个学生对象，并再添加时进行学号的唯一性判断
        //读题拆解，逐步细化
        //添加stu4
        Student stu4 = new Student(4, "zhaoliu", 26);
        //唯一性判断（写在前） --> 采用一个方法
        //已存在 --- 不用添加
        //不存在 --- 可把学生对象添加进数组
        boolean flag = contains(arr, stu4.getId());
        if (flag) {
            System.out.println("当前id重复，请修改id后再进行添加");
        } else {
            //数组没有存满 --- 直接添加
            //数组已经存满 --- 创建一个新的数组，新数组的长度 = 老数组的长度 + 1
            int count = getCount(arr);
            if (count == arr.length) {
                //已经存满
                //创建一个新的数组，新数组的长度 = 老数组的长度 + 1
                //然后把老数组的元素拷贝到新数组中
                Student[] newArray = newArr(arr);//将方法值返回给一个新的数组newArray
                newArray[count] = stu4;
                //[2].添加完毕后，遍历所有学生信息
                printArr(newArray);
                System.out.println(" ");
            } else {
                //没有存满
                //如果getCount获取到2，表示数组当中已经有了2个元素
                //还有一层意思：若下一次要添加数据，就是添加到2索引的位置!!!
                arr[count] = stu4;
                //[2].添加完毕后，遍历所有学生信息
                printArr(arr);
                System.out.println(" ");
            }
        }

        //[3].通过id删除学生信息
        //  如果存在则删除，反之提示删除失败
        //分析：
        //要找到id再数组当中的索引
        //1).定义一个方法：getIndex --- 寻找id在数组当中的索引
        int index = getIndex(arr,4);
        //对index进行判断
        if (index >= 0){
            //如果存在，则删除
            arr[index] = null;
            //[4].删除完毕后，遍历所有学生信息
            printArr(arr);
            System.out.println(" ");
        }else {
            System.out.println("当前id不存在，删除失败");
            System.out.println(" ");
        }

        //[5].查询数组id为“2”的学生，如果存在，则将他的年龄+1岁
        int index2 = getIndex(arr,2);
        //对index进行判断
        if (index2 >= 0){
            //如果存在，则将他的年龄+1岁
            Student stu = arr[index2];
            int newAge = stu.getAge() + 1;
            //把+1后的年龄塞回去
            stu.setAge(newAge);
            //遍历所有学生信息
            printArr(arr);
        }else {
            System.out.println("当前id不存在,修改失败");
        }
    }


    //方法一：定义一个方法判断数组中已经存了几个元素
    //要干嘛？                        判断存放了几个元素
    //做这件事情需要什么才能完成？        数组
    //调用处是否需要继续使用方法的结果？   需要返回
    public static int getCount(Student[] arr) {
        //统计数量的计数器
        int count = 0;
        //判断数组是否存了数据，是否为NULL
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                count++;
            }
        }
        //循环结束后，则确认数组中一共有几个元素
        return count;
    }


    //方法二：唯一性判断
    //要干嘛？                        唯一性判断
    //做这件事情需要什么才能完成？        数组、id
    //调用处是否需要继续使用方法的结果？   需要返回
    public static boolean contains(Student[] arr, int id) {
        //依次获取数组里面的每一个学生对象
        for (int i = 0; i < arr.length; i++) {
            Student s = arr[i];
            if (s != null) {
                //获取数组中学生对象的id
                int sid = s.getId();
                //运行报错：需对s数组中的元素进行非空判断，空元素是无法参与后续流程的
                //比较
                if (sid == id) {
                    return true;
                }
            }
        }
        //不能写else直接返回false！而是写在循环外面，若没有一样的，则说明此id不存在
        return false;
    }


        //方法三：创建一个新的数组，把存满的数组的元素拷贝到新数组中
        //要干嘛？                        创建数组，拷贝
        //做这件事情需要什么才能完成？        数组
        //调用处是否需要继续使用方法的结果？   需要返回
        public static Student[] newArr (Student[]arr){
            Student[] newArr = new Student[arr.length + 1];

            //循环遍历得到老数组中的每一个元素
            for (int i = 0; i < arr.length; i++) {
                newArr[i] = arr[i];//新老交替
            }

            //新数组返回
            return newArr;
        }


        //方法四：遍历打印更新后的数组信息
        public static void printArr (Student[]arr){
            for (int i = 0; i < arr.length; i++) {
                Student stu = arr[i];
                //先进行一个非空判断
                if (stu != null) {
                    System.out.println(stu.getId() + "," + stu.getName() + "," + stu.getAge());
                }
            }
        }


        //方法五：找到id在数组当中的索引
        //要干嘛？                        找索引
        //做这件事情需要什么才能完成？        数组、id
        //调用处是否需要继续使用方法的结果？   需要返回索引
        public static int getIndex(Student[] arr,int id) {
            for (int i = 0; i < arr.length; i++) {
                //依次得到每一个学生对象
                Student stu = arr[i];
                //对stu进行一个非空判断
                if (stu != null){
                    int sid = stu.getId();
                    if (sid == id){
                        return i;//id相同则返回，不同则不用写else，回到i++，继续查找下一个元素
                    }
                }
            }
            //循环结束后还没找到，则表示不存在
            return -1;//世界上是没有-1索引的
        }

    }
